package com.exp.controller;
import com.exp.dto.DocumentIUpdateDTO;
import com.exp.dto.DocumentInfDTO;
import com.exp.interceptor.JwtTokenAdminInterceptor;
import com.exp.pojo.NoticeInf;
import org.springframework.beans.BeanUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpHeaders;
import com.exp.dto.DocumentPageQueryDTO;
import com.exp.pojo.DocumentInf;
import com.exp.result.PageResult;
import com.exp.result.Result;
import com.exp.result.StatusCode;
import com.exp.service.DocumentInfService;
import com.exp.utils.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 下载中心模块-pyz
 */
@RestController
@RequestMapping("/admin/documentInf")
@Slf4j
public class DocumentInfController {

    @Autowired
    private DocumentInfService documentInfService;

    /*
     * 文档查询-分页查询
     * 搜索条件：文档标题
     */
    @PostMapping("/page")
    public Result<PageResult> page(@RequestBody DocumentPageQueryDTO documentPageQueryDTO){
        System.out.println(documentPageQueryDTO);
        PageResult pageResult = documentInfService.pageQuery(documentPageQueryDTO);
        System.out.println(pageResult);
        return Result.success(StatusCode.SUCCESS, Message.PAGE_SUCCESS,pageResult);
    }


    /*
     * 编辑文档
     * 输入：文档标题、文档描述、上传文档
     */
    @PutMapping("/update")
    public Result<DocumentInf> update(@RequestBody DocumentIUpdateDTO documentIUpdateDTO){
        log.info("编辑文档信息：{}", documentIUpdateDTO);
        documentInfService.update(documentIUpdateDTO);
        Integer noid = documentIUpdateDTO.getId();
        DocumentInf documentInf = new DocumentInf();
        if (noid!=null){
            documentInf = documentInfService.getById(noid);
        }
        return Result.success(StatusCode.SUCCESS,Message.UPDATE_SUCCESS,documentInf);
    }

    /*
     * 上传文档-新增文档
     * 输入：文档标题、文档描述、上传文档
     */

    @PostMapping("/add")
    public Result<DocumentInf> save(@RequestBody DocumentInfDTO documentInfDTO){
        log.info("新增文档：{}",documentInfDTO);
        DocumentInf documentInf = new DocumentInf();
        BeanUtils.copyProperties(documentInfDTO, documentInf);
        // 从ThreadLocal中获取userId
        Integer userId = JwtTokenAdminInterceptor.threadLocal.get();
        if (userId != null) {
            // 使用userId进行操作
            documentInf.setUserId(userId);
        }
        documentInfService.save(documentInf);
        return Result.success(StatusCode.SUCCESS,Message.SAVE_SUCCESS,documentInf);
    }

    /*
     * 批量删除 ids
     */
    @DeleteMapping("/delete")
    public Result delete(@RequestParam List<Integer> ids) {
        log.info("批量删除文档：{}",ids);
        documentInfService.deleteBatch(ids);
        return Result.success(StatusCode.SUCCESS,Message.DELETE_SUCCESS,ids);
    }


    /*
     * 文件的上传
     * 输入：文档标题、文档描述、上传文档
     */
    @PostMapping("/upload")
    public Result handleFileUpload(@RequestParam("file") MultipartFile file) {
        log.info("接受你文件" + file);
        if (file.isEmpty()) {
            return Result.success(StatusCode.SUCCESS, "请选择一个文件");
        }

        try {
            // 获取文件的原始名称
            String originalFileName = file.getOriginalFilename();
            String fileNameWithoutExtension = ""; // 用于存储不带扩展名的文件名

            int i = originalFileName.lastIndexOf('.'); // 寻找文件名中最后一个点（'.'）的位置
            if (i > 0) { // 如果最后一个点的位置大于0（即文件名中确实有扩展名）
                fileNameWithoutExtension = originalFileName.substring(0, i); // 从文件名的开始截取到点的位置，不包括点
            } else {
                fileNameWithoutExtension = originalFileName; // 如果没有点，即没有扩展名，直接使用原始文件名
            }
            // 获取文件的扩展名
            String extension = originalFileName.substring(originalFileName.lastIndexOf("."));
            // 使用当前时间戳生成唯一的文件名
            String newFileName = fileNameWithoutExtension+System.currentTimeMillis() + extension;
            // 文件存储路径
            Path path = Paths.get("src/main/resources/file/" + newFileName);
            // 保存文件
            Files.copy(file.getInputStream(), path);
            Map<String, String> data = new HashMap<>();
            data.put("fileName", newFileName);
            return Result.success(StatusCode.SUCCESS, "上传成功", data);
        } catch (IOException e) {
            log.info(e.getMessage());
            return Result.error(StatusCode.ERROR, "上传失败");
        }
    }


    /*
     * 文件下载
     */
    private final Path fileStorageLocation = Paths.get("src/main/resources/file");
    @GetMapping("/download/{fileName:.+}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {
        try {
            Path filePath = this.fileStorageLocation.resolve(fileName).normalize();
            Resource resource = new UrlResource(filePath.toUri());
            if (resource.exists() || resource.isReadable()) {
                String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
                String contentDisposition = "attachment; filename*=UTF-8''" + encodedFileName;
                return ResponseEntity.ok()
                        .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
                        .body(resource);
            } else {
                return ResponseEntity.notFound().build();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.internalServerError().build();
        }
    }
}
